﻿namespace x86Disasm
{
    public partial class Disassembler
    {
        private Instruction[] instructions =
        { 
            new Instruction { OpCode=0x0000, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} },
            new Instruction { OpCode=0x0001, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x0002, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x0003, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0004, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x0005, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x0006, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.ES } } ,
            new Instruction { OpCode=0x0007, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.ES } } ,
            new Instruction { OpCode=0x0008, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0009, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x000a, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x000b, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x000c, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x000d, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x000e, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.CS } } ,
            new Instruction { OpCode=0x000f, Type=InstructionType.Extended, NumberOfArguments = 0, Nmumonic = "EXT" } ,
            new Instruction { OpCode=0x0010, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0011, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x0012, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x0013, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0014, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x0015, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x0016, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.SS } } ,
            new Instruction { OpCode=0x0017, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.SS } } ,
            new Instruction { OpCode=0x0018, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0019, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x001a, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x001b, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x001c, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x001d, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x001e, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.DS } } ,
            new Instruction { OpCode=0x001f, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Size=16, Value=(int)SegmentRegister.DS } } ,
            new Instruction { OpCode=0x0020, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0021, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x0022, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x0023, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0024, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x0025, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x0026, Type=InstructionType.Prefix, Value=(int)OPPrefix.ESOverride, Nmumonic = "ES:" } ,
            new Instruction { OpCode=0x0027, Type=InstructionType.DataTransfer, NumberOfArguments = 0, Nmumonic = "DAA" } ,
            new Instruction { OpCode=0x0028, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0029, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x002a, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x002b, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x002c, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x002d, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x002e, Type=InstructionType.Prefix, Value=(int)OPPrefix.CSOverride, Nmumonic = "CS:" } ,
            new Instruction { OpCode=0x002f, Type=InstructionType.BCD, NumberOfArguments = 0, Nmumonic = "DAS" } ,
            new Instruction { OpCode=0x0030, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0031, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x0032, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x0033, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0034, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x0035, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x0036, Type=InstructionType.Prefix, Value=(int)OPPrefix.SSOverride, Nmumonic = "SS:" } ,
            new Instruction { OpCode=0x0037, Type=InstructionType.BCD, NumberOfArguments = 0, Nmumonic = "AAA" } ,
            new Instruction { OpCode=0x0038, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} } ,
            new Instruction { OpCode=0x0039, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x003a, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x003b, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x003c, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            new Instruction { OpCode=0x003d, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x003e, Type=InstructionType.Prefix, Value=(int)OPPrefix.DSOverride, Nmumonic = "DS:" } ,
            new Instruction { OpCode=0x003f, Type=InstructionType.BCD, NumberOfArguments = 0, Nmumonic = "AAS" } ,
            new Instruction { OpCode=0x0040, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x0041, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX } },
            new Instruction { OpCode=0x0042, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x0043, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX } },
            new Instruction { OpCode=0x0044, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP } },                
            new Instruction { OpCode=0x0045, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP } },
            new Instruction { OpCode=0x0046, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI } },
            new Instruction { OpCode=0x0047, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI } },
            new Instruction { OpCode=0x0048, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x0049, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX } },
            new Instruction { OpCode=0x004a, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x004b, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX } },
            new Instruction { OpCode=0x004c, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP } },                
            new Instruction { OpCode=0x004d, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP } },
            new Instruction { OpCode=0x004e, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI } },
            new Instruction { OpCode=0x004f, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI } },
            new Instruction { OpCode=0x0050, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x0051, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX } },
            new Instruction { OpCode=0x0052, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x0053, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX } },
            new Instruction { OpCode=0x0054, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP } },                
            new Instruction { OpCode=0x0055, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP } },
            new Instruction { OpCode=0x0056, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI } },
            new Instruction { OpCode=0x0057, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI } },
            new Instruction { OpCode=0x0058, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x0059, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX } },
            new Instruction { OpCode=0x005a, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x005b, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX } },
            new Instruction { OpCode=0x005c, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP } },                
            new Instruction { OpCode=0x005d, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP } },
            new Instruction { OpCode=0x005e, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI } },
            new Instruction { OpCode=0x005f, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI } },
            new Instruction { OpCode=0x0060, Type=InstructionType.DataTransfer, NumberOfArguments = 0, Nmumonic = "PUSHA" },
            new Instruction { OpCode=0x0061, Type=InstructionType.DataTransfer, NumberOfArguments = 0, Nmumonic = "POPA" },
            new Instruction { OpCode=0x0062, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0063, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0064, Type=InstructionType.Prefix, Value=(int)OPPrefix.FSOverride, Nmumonic = "FS:" } ,
            new Instruction { OpCode=0x0065, Type=InstructionType.Prefix, Value=(int)OPPrefix.GSOverride, Nmumonic = "GS:" },
            new Instruction { OpCode=0x0066, Type=InstructionType.Prefix, Value=(int)OPPrefix.OperandSize },
            new Instruction { OpCode=0x0067, Type=InstructionType.Prefix, Value=(int)OPPrefix.AddressSize },
            new Instruction { OpCode=0x0068, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type = ArgumentType.Immediate, Size = 16 } },
            new Instruction { OpCode=0x0069, Type=InstructionType.Arithmetic, NumberOfArguments = 3, Nmumonic = "IMUL", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg3=new Argument { Type=ArgumentType.Immediate, Size=16, SignExtend=true } },
            new Instruction { OpCode=0x006a, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type = ArgumentType.Immediate, Size = 8 } },
            new Instruction { OpCode=0x006b, Type=InstructionType.Arithmetic, NumberOfArguments = 3, Nmumonic = "IMUL", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg3=new Argument { Type=ArgumentType.Immediate, Size=8, SignExtend=true } },
            new Instruction { OpCode=0x006c, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic="INSB", Arg1=new Argument { Type=ArgumentType.Memory, Size=8, UsesES=true }, Arg2=new Argument { Type = ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x006c, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic="INSW", Arg1=new Argument { Type=ArgumentType.Memory, Size=16, UsesES=true }, Arg2=new Argument { Type = ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX } },
            new Instruction { OpCode=0x006e, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic="OUTSB", Arg1=new Argument { Type = ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX }, Arg2=new Argument { Type=ArgumentType.Memory, Size=8, UsesES=true } },
            new Instruction { OpCode=0x006f, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic="OUTSW", Arg1=new Argument { Type = ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX }, Arg2=new Argument { Type=ArgumentType.Memory, Size=16, UsesES=true } },
            new Instruction { OpCode=0x0070, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JO", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0071, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JNO", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0072, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JB", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0073, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JNB", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0074, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JZ", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0075, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JNZ", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0076, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JBE", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0077, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JNBE", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0078, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JS", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0079, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JNS", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007a, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JPE", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007b, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JPO", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007c, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JL", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007d, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JGE", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007e, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JLE", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x007f, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JG", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x0080, Type=InstructionType.Group, Value=0, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x0081, Type=InstructionType.Group, Value=1, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x0082, Type=InstructionType.Group, Value=2, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x0083, Type=InstructionType.Group, Value=3, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x0084, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} },
            new Instruction { OpCode=0x0085, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0086, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} },
            new Instruction { OpCode=0x0087, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x0088, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=8} },
            new Instruction { OpCode=0x0089, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemGeneral, Size=16} } ,
            new Instruction { OpCode=0x008a, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=8 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=8} } ,
            new Instruction { OpCode=0x008b, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x008c, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemSegment, Size=16} } ,
            new Instruction { OpCode=0x008d, Type=InstructionType.Misc, NumberOfArguments = 2, Nmumonic = "LEA", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMemMemory, Size=16} } ,
            new Instruction { OpCode=0x008e, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMemSegment, Size=16 }, Arg2=new Argument {Type=ArgumentType.RegMem, Size=16} } ,
            new Instruction { OpCode=0x008f, Type=InstructionType.DataTransfer, NumberOfArguments = 1, Nmumonic = "POP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
            new Instruction { OpCode=0x0090, Type=InstructionType.Misc, NumberOfArguments = 0, Nmumonic = "NOP" } ,
            new Instruction { OpCode=0x0091, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0092, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0093, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0094, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0095, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0096, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0097, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "XCHG", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} },
            new Instruction { OpCode=0x0098, Type=InstructionType.DataTransfer, NumberOfArguments = 0, Nmumonic = "CBW" } ,
            new Instruction { OpCode=0x0099, Type=InstructionType.DataTransfer, NumberOfArguments = 0, Nmumonic = "CWD" } ,
            new Instruction { OpCode=0x009a, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "CALL", Arg1=new Argument { Type=ArgumentType.Address, Size=32 } },
            new Instruction { OpCode=0x009b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x009c, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "PUSHF" } ,
            new Instruction { OpCode=0x009d, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "POPF" } ,
            new Instruction { OpCode=0x009e, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "SAHF" } ,
            new Instruction { OpCode=0x009f, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "LAHF" } ,
            new Instruction { OpCode=0x00a0, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Offset, Size=8 } },
            new Instruction { OpCode=0x00a1, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument {Type=ArgumentType.Offset, Size=16 } },
            new Instruction { OpCode=0x00a2, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.Offset, Size=8 }, Arg2=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x00a3, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.Offset, Size=16 }, Arg2=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX } },
            new Instruction { OpCode=0x00a4, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "MOVSB", Arg1=new Argument { Type=ArgumentType.Memory, Size=8, UsesES=true }, Arg2=new Argument{ Type=ArgumentType.Memory, Size=8 } },
            new Instruction { OpCode=0x00a5, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "MOVSW", Arg1=new Argument { Type=ArgumentType.Memory, Size=16, UsesES=true }, Arg2=new Argument{ Type=ArgumentType.Memory, Size=16 } },
            new Instruction { OpCode=0x00a6, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "CMPSB", Arg1=new Argument { Type=ArgumentType.Memory, Size=8, UsesES=true }, Arg2=new Argument{ Type=ArgumentType.Memory, Size=8 } },
            new Instruction { OpCode=0x00a7, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "CMPSW", Arg1=new Argument { Type=ArgumentType.Memory, Size=16, UsesES=true }, Arg2=new Argument{ Type=ArgumentType.Memory, Size=16 } },
            new Instruction { OpCode=0x00a8, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00a9, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00aa, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "STOSB", Arg1=new Argument { Type=ArgumentType.Memory, Size=8, UsesES=true }, Arg2=new Argument{Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.EAX} } ,
            new Instruction { OpCode=0x00ab, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "STOSW", Arg1=new Argument { Type=ArgumentType.Memory, Size=16, UsesES=true }, Arg2=new Argument{Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} } ,
            new Instruction { OpCode=0x00ac, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "LODSB", Arg1=new Argument{ Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument { Type=ArgumentType.Memory, Size=8 } } ,
            new Instruction { OpCode=0x00ad, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "LODSW", Arg1=new Argument{ Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX}, Arg2=new Argument { Type=ArgumentType.Memory, Size=16 } } ,
            new Instruction { OpCode=0x00ae, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "SCASB", Arg1=new Argument { Type=ArgumentType.Memory, Size=8, UsesES = true }, Arg2=new Argument{Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.EAX} } ,
            new Instruction { OpCode=0x00af, Type=InstructionType.String, NumberOfArguments = 2, Nmumonic = "SCASW", Arg1=new Argument { Type=ArgumentType.Memory, Size=16, UsesES = true }, Arg2=new Argument{Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX} } ,
            new Instruction { OpCode=0x00b0, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AL }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b1, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.CL }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b2, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.DL }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b3, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.BL }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b4, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.AH }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b5, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.CH }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b6, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.DH }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b7, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.BH }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00b8, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00b9, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ECX }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00ba, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDX }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00bb, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBX }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00bc, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESP }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00bd, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EBP }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00be, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.ESI }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00bf, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EDI }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} },
            new Instruction { OpCode=0x00c0, Type=InstructionType.Group, Value=4, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} },
            new Instruction { OpCode=0x00c1, Type=InstructionType.Group, Value=5, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} },
            new Instruction { OpCode=0x00c2, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "RET", Arg1=new Argument { Type=ArgumentType.Immediate, Size=16 } },
            new Instruction { OpCode=0x00c3, Type=InstructionType.ControlTransfer, NumberOfArguments = 0, Nmumonic = "RET" },
            new Instruction { OpCode=0x00c4, Type=InstructionType.SegmentRegister, NumberOfArguments=2, Nmumonic = "LES", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemMemory, Size=32} },
            new Instruction { OpCode=0x00c5, Type=InstructionType.SegmentRegister, NumberOfArguments=2, Nmumonic = "LDS", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemMemory, Size=32} },
            new Instruction { OpCode=0x00c6, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00c7, Type=InstructionType.DataTransfer, NumberOfArguments = 2, Nmumonic = "MOV", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=16} } ,
            new Instruction { OpCode=0x00c8, Type=InstructionType.EnterLeave, NumberOfArguments = 2, Nmumonic="ENTER", Arg1=new Argument { Type=ArgumentType.Immediate, Size=16 }, Arg2=new Argument { Type=ArgumentType.Immediate, Size=8 } },
            new Instruction { OpCode=0x00c9, Type=InstructionType.EnterLeave, NumberOfArguments = 0, Nmumonic="LEAVE" },
            new Instruction { OpCode=0x00ca, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "RET", Arg1=new Argument { Type=ArgumentType.Immediate, Size=16 } },
            new Instruction { OpCode=0x00cb, Type=InstructionType.ControlTransfer, NumberOfArguments = 0, Nmumonic = "RET" },
            new Instruction { OpCode=0x00cc, Type=InstructionType.ControlTransfer, NumberOfArguments = 0, Nmumonic = "INT 3" },
            new Instruction { OpCode=0x00cd, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "INT", Arg1=new Argument { Type=ArgumentType.Immediate, Size=8 } },
            new Instruction { OpCode=0x00ce, Type=InstructionType.ControlTransfer, NumberOfArguments = 0, Nmumonic = "INTO" },
            new Instruction { OpCode=0x00cf, Type=InstructionType.ControlTransfer, NumberOfArguments = 0, Nmumonic = "IRET" },
            new Instruction { OpCode=0x00d0, Type=InstructionType.Group, Value=6, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument { Type=ArgumentType.Constant, Size=8, Value=1} },
            new Instruction { OpCode=0x00d1, Type=InstructionType.Group, Value=7, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument { Type=ArgumentType.Constant, Size=8, Value=1} },
            new Instruction { OpCode=0x00d2, Type=InstructionType.Group, Value=8, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.CL} },
            new Instruction { OpCode=0x00d3, Type=InstructionType.Group, Value=9, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument { Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister8Bit.CL} },
            new Instruction { OpCode=0x00d4, Type=InstructionType.BCD, NumberOfArguments = 1, Nmumonic = "AAM", Arg1=new Argument { Type=ArgumentType.ImmediateSuppressDefault, Size=8 } },
            new Instruction { OpCode=0x00d5, Type=InstructionType.BCD, NumberOfArguments = 1, Nmumonic = "AAD", Arg1=new Argument { Type=ArgumentType.ImmediateSuppressDefault, Size=8 } },
            new Instruction { OpCode=0x00d6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00d7, Type=InstructionType.Misc, NumberOfArguments = 0, Nmumonic = "XLAT" },
            new Instruction { OpCode=0x00d8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00d9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00da, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00db, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00dc, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00dd, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00de, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00df, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00e0, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "LOOPNZ", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x00e1, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "LOOPZ", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x00e2, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "LOOP", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x00e3, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JCXZ", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x00e4, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "IN", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00e5, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "IN", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} },
            new Instruction { OpCode=0x00e6, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "OUT", Arg1=new Argument { Type=ArgumentType.Immediate, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=8} },
            new Instruction { OpCode=0x00e7, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "OUT", Arg1=new Argument { Type=ArgumentType.Immediate, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=16} },
            new Instruction { OpCode=0x00e8, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "CALL", Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x00e9, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JMP", Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x00ea, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JMP FAR", Arg1=new Argument { Type=ArgumentType.Address, Size=32 } },
            new Instruction { OpCode=0x00eb, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JMP", Arg1=new Argument { Type=ArgumentType.Relative, Size=8 } },
            new Instruction { OpCode=0x00ec, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "IN", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EDX, Size=16} },
            new Instruction { OpCode=0x00ed, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "IN", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EDX, Size=16} },
            new Instruction { OpCode=0x00ee, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "OUT", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EDX, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=8} },
            new Instruction { OpCode=0x00ef, Type=InstructionType.InputOutput, NumberOfArguments = 2, Nmumonic = "OUT", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EDX, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=16} },
            new Instruction { OpCode=0x00f0, Type=InstructionType.Prefix, Value=(int)OPPrefix.Lock, Nmumonic = "LOCK" } ,
            new Instruction { OpCode=0x00f1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x00f2, Type=InstructionType.Prefix, Value=(int)OPPrefix.RepeatNotEqual, Nmumonic = "REPNE" } ,
            new Instruction { OpCode=0x00f3, Type=InstructionType.Prefix, Value=(int)OPPrefix.Repeat, Nmumonic = "REP" } ,
            new Instruction { OpCode=0x00f4, Type=InstructionType.System, NumberOfArguments = 0, Nmumonic = "HLT" },
            new Instruction { OpCode=0x00f5, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "CMC" },
            new Instruction { OpCode=0x00f6, Type=InstructionType.Group, Value=0xa, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x00f7, Type=InstructionType.Group, Value=0xb, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
            new Instruction { OpCode=0x00f8, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "CLC" },
            new Instruction { OpCode=0x00f9, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "STC" },
            new Instruction { OpCode=0x00fa, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "CLI" },
            new Instruction { OpCode=0x00fb, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "STI" },
            new Instruction { OpCode=0x00fc, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "CLD" },
            new Instruction { OpCode=0x00fd, Type=InstructionType.Flag, NumberOfArguments = 0, Nmumonic = "STD" },
            new Instruction { OpCode=0x00fe, Type=InstructionType.Group, Value=0xc, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x00ff, Type=InstructionType.Group, Value=0xd, NumberOfArguments = 2, Nmumonic = "GRP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
        };

        private Instruction[,] groups = 
        {
            {
                new Instruction { OpCode=0x8000, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8001, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8002, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8003, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8004, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8005, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8006, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8007, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            },
            {
                new Instruction { OpCode=0x8100, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8101, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8102, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8103, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8104, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8105, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8106, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0x8107, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
            },
            {
                new Instruction { OpCode=0x8200, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8201, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8202, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8203, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8204, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8205, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8206, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0x8207, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            },
            {
                new Instruction { OpCode=0x8300, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADD", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8301, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "OR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8302, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "ADC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8303, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SBB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8304, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "AND", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8305, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "SUB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8306, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "XOR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
                new Instruction { OpCode=0x8307, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "CMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8, SignExtend=true} } ,
            },
            {
                new Instruction { OpCode=0xc000, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc001, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc002, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc003, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc004, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc005, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc006, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc007, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            },
            {
                new Instruction { OpCode=0xc100, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc101, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc102, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc103, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc104, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc105, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc106, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xc107, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
            },
            {
                new Instruction { OpCode=0xd000, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd001, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd002, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd003, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd004, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd005, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd006, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd007, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
            },
            {
                new Instruction { OpCode=0xd100, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd101, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd102, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd103, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd104, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd105, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd106, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
                new Instruction { OpCode=0xd107, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Constant, Size=8, Value=1} } ,
            },
            {
                new Instruction { OpCode=0xd200, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd201, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd202, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd203, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd204, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd205, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd206, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd207, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} }
            },
            {
                new Instruction { OpCode=0xd300, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd301, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "ROR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd302, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd303, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "RCR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd304, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd305, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SHR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd306, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
                new Instruction { OpCode=0xd307, Type=InstructionType.Logical, NumberOfArguments = 2, Nmumonic = "SAR", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.GeneralRegister, Size=8, Value=(int)GeneralRegister.ECX} } ,
            },
            {
                new Instruction { OpCode=0xf600, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xf601, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=8} } ,
                new Instruction { OpCode=0xf602, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "NOT", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } } ,
                new Instruction { OpCode=0xf603, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "NEG", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } } ,
                new Instruction { OpCode=0xf604, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "MUL", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=8} } ,
                new Instruction { OpCode=0xf605, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "IMUL", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=8} } ,
                new Instruction { OpCode=0xf606, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "DIV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=8} } ,
                new Instruction { OpCode=0xf607, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "IDIV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=8} } ,
            },
            {
                new Instruction { OpCode=0xf700, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0xf701, Type=InstructionType.BitByte, NumberOfArguments = 2, Nmumonic = "TEST", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument {Type=ArgumentType.Immediate, Size=16} } ,
                new Instruction { OpCode=0xf702, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "NOT", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } } ,
                new Instruction { OpCode=0xf703, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "NEG", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } } ,
                new Instruction { OpCode=0xf704, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "MUL", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=16} } ,
                new Instruction { OpCode=0xf705, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "IMUL", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=16} } ,
                new Instruction { OpCode=0xf706, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "DIV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=16} } ,
                new Instruction { OpCode=0xf707, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "IDIV", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Size=16, Value=(int)GeneralRegister.EAX }, Arg2=new Argument{Type=ArgumentType.RegMem, Size=16} } ,
            },
            {
                new Instruction { OpCode=0xfe00, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
                new Instruction { OpCode=0xfe01, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
                new Instruction { OpCode=0xfe02, Type=InstructionType.Invalid },
                new Instruction { OpCode=0xfe03, Type=InstructionType.Invalid },
                new Instruction { OpCode=0xfe04, Type=InstructionType.Invalid },
                new Instruction { OpCode=0xfe05, Type=InstructionType.Invalid },
                new Instruction { OpCode=0xfe06, Type=InstructionType.Invalid },
                new Instruction { OpCode=0xfe07, Type=InstructionType.Invalid },
            },
            {
                new Instruction { OpCode=0xff00, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "INC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0xff01, Type=InstructionType.Arithmetic, NumberOfArguments = 1, Nmumonic = "DEC", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0xff02, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "CALL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0xff03, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "CALL FAR", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=32 } },
                new Instruction { OpCode=0xff04, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JMP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0xff05, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "JMP FAR", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0xff06, Type=InstructionType.ControlTransfer, NumberOfArguments = 1, Nmumonic = "PUSH", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0xff07, Type=InstructionType.Invalid },
            },
            {
                new Instruction { OpCode=0x0f0000, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0001, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0002, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="LLDT", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0003, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="LTR", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0004, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0005, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0006, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0007, Type = InstructionType.Invalid },
            },
            {
                new Instruction { OpCode=0x0f0100, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="SGDT", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0101, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="SIDT", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0102, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="LGDT", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0103, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="LIDT", Arg1=new Argument { Type=ArgumentType.RegMemMemory, Size=16 } },
                new Instruction { OpCode=0x0f0104, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="SMSW", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0x0f0105, Type = InstructionType.Invalid },
                new Instruction { OpCode=0x0f0106, Type = InstructionType.System, NumberOfArguments=1, Nmumonic="LMSW", Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 } },
                new Instruction { OpCode=0x0f0107, Type = InstructionType.Invalid },
            },
        };

        private Instruction[] extendedInstructions = 
        {
            new Instruction { OpCode=0x0f00, Type=InstructionType.Group, Value=0xe },
            new Instruction { OpCode=0x0f01, Type=InstructionType.Group, Value=0xf },
            new Instruction { OpCode=0x0f02, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f03, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f04, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f05, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f06, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f07, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f08, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f09, Type=InstructionType.System, NumberOfArguments=0, Nmumonic="WBINVD" },
            new Instruction { OpCode=0x0f0a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f0b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f0c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f0d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f0e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f0f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f10, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f11, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f12, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f13, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f14, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f15, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f16, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f17, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f18, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f19, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f1f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f20, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOV", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=32 }, Arg2=new Argument { Type=ArgumentType.RegMemControl, Size=32 } },
            new Instruction { OpCode=0x0f21, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f22, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOV", Arg1=new Argument { Type=ArgumentType.RegMemControl, Size=32 }, Arg2=new Argument { Type=ArgumentType.RegMemGeneral, Size=32 } },
            new Instruction { OpCode=0x0f23, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f24, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f25, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f26, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f27, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f28, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f29, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f2f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f30, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f31, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f32, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f33, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f34, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f35, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f36, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f37, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f38, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f39, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f3f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f40, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f41, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f42, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f43, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f44, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f45, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f46, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f47, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f48, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f49, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f4f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f50, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f51, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f52, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f53, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f54, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f55, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f56, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f57, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f58, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f59, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f5f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f60, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f61, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f62, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f63, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f64, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f65, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f66, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f67, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f68, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f69, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f6f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f70, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f71, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f72, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f73, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f74, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f75, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f76, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f77, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f78, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f79, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7a, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7b, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7c, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7d, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7e, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f7f, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0f80, Type=InstructionType.ControlTransfer, Nmumonic="JO", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f81, Type=InstructionType.ControlTransfer, Nmumonic="JNO", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f82, Type=InstructionType.ControlTransfer, Nmumonic="JB", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f83, Type=InstructionType.ControlTransfer, Nmumonic="JNB", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f84, Type=InstructionType.ControlTransfer, Nmumonic="JZ", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f85, Type=InstructionType.ControlTransfer, Nmumonic="JNZ", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f86, Type=InstructionType.ControlTransfer, Nmumonic="JBE", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f87, Type=InstructionType.ControlTransfer, Nmumonic="JNBE", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f88, Type=InstructionType.ControlTransfer, Nmumonic="JS", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f89, Type=InstructionType.ControlTransfer, Nmumonic="JNS", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8a, Type=InstructionType.ControlTransfer, Nmumonic="JP", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8b, Type=InstructionType.ControlTransfer, Nmumonic="JPO", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8c, Type=InstructionType.ControlTransfer, Nmumonic="JL", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8d, Type=InstructionType.ControlTransfer, Nmumonic="JNL", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8e, Type=InstructionType.ControlTransfer, Nmumonic="JLE", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f8f, Type=InstructionType.ControlTransfer, Nmumonic="JNLE", NumberOfArguments=1, Arg1=new Argument { Type=ArgumentType.Relative, Size=16 } },
            new Instruction { OpCode=0x0f90, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETO", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f91, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNO", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f92, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f93, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNB", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f94, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETZ", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f95, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNZ", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f96, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETBE", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f97, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNBE", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f98, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETS", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f99, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNS", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9a, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETP", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9b, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETPO", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9c, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9d, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNL", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9e, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETLE", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0f9f, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="SETNLE", Arg1=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0fa0, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Value=(int)SegmentRegister.FS } },
            new Instruction { OpCode=0x0fa1, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="POP", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Value=(int)SegmentRegister.FS } },
            new Instruction { OpCode=0x0fa2, Type=InstructionType.System, NumberOfArguments = 1, Nmumonic="CPUID", Arg1=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.EAX, Size=32 } },
            new Instruction { OpCode=0x0fa3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fa4, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fa5, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fa6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fa7, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fa8, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="PUSH", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Value=(int)SegmentRegister.GS } },
            new Instruction { OpCode=0x0fa9, Type=InstructionType.DataTransfer, NumberOfArguments=1, Nmumonic="POP", Arg1=new Argument { Type=ArgumentType.SegmentRegister, Value=(int)SegmentRegister.GS } },
            new Instruction { OpCode=0x0faa, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fab, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fac, Type=InstructionType.Logical, Nmumonic="SHRD", NumberOfArguments=3, Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg3=new Argument { Type=ArgumentType.Immediate, Size=8 } },
            new Instruction { OpCode=0x0fad, Type=InstructionType.Logical, Nmumonic="SHRD", NumberOfArguments=3, Arg1=new Argument { Type=ArgumentType.RegMem, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg3=new Argument { Type=ArgumentType.GeneralRegister, Value=(int)GeneralRegister.ECX, Size=8 } },
            new Instruction { OpCode=0x0fae, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0faf, Type=InstructionType.Arithmetic, NumberOfArguments = 2, Nmumonic = "IMUL", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16 } },
            new Instruction { OpCode=0x0fb0, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fb1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fb2, Type=InstructionType.SegmentRegister, NumberOfArguments=2, Nmumonic = "LSS", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemMemory, Size=32} },
            new Instruction { OpCode=0x0fb3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fb4, Type=InstructionType.SegmentRegister, NumberOfArguments=2, Nmumonic = "LFS", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemMemory, Size=32} },
            new Instruction { OpCode=0x0fb5, Type=InstructionType.SegmentRegister, NumberOfArguments=2, Nmumonic = "LGS", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMemMemory, Size=32} },
            new Instruction { OpCode=0x0fb6, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOVZX", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0fb7, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOVZX", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=32 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16, IgnorePrefix=true } },
            new Instruction { OpCode=0x0fb8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fb9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fba, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fbb, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fbc, Type=InstructionType.BitByte, NumberOfArguments=2, Nmumonic="BSF", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16 } },
            new Instruction { OpCode=0x0fbd, Type=InstructionType.BitByte, NumberOfArguments=2, Nmumonic="BSR", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16 } },
            new Instruction { OpCode=0x0fbe, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOVSX", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=16 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=8 } },
            new Instruction { OpCode=0x0fbf, Type=InstructionType.DataTransfer, NumberOfArguments=2, Nmumonic="MOVSX", Arg1=new Argument { Type=ArgumentType.RegMemGeneral, Size=32 }, Arg2=new Argument { Type=ArgumentType.RegMem, Size=16, IgnorePrefix=true } },
            new Instruction { OpCode=0x0fc0, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc2, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc4, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc5, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc7, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fc9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fca, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fcb, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fcc, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fcd, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fce, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fcf, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd0, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd2, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd4, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd5, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd7, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fd9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fda, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fdb, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fdc, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fdd, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fde, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fdf, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe0, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe2, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe4, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe5, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe7, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fe9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fea, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0feb, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fec, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fed, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fee, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fef, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff0, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff1, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff2, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff3, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff4, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff5, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff6, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff7, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff8, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ff9, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ffa, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ffb, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ffc, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ffd, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0ffe, Type=InstructionType.Invalid },
            new Instruction { OpCode=0x0fff, Type=InstructionType.Invalid },
        };

        private MemoryOperand[] regMemMemory16 = 
        {
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.ESI, Segment=SegmentRegister.SS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EDI, Segment=SegmentRegister.SS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.None, Segment=SegmentRegister.SS, Size = 16 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 16 },
        };

        private MemoryOperand[] regMemMemory32 =
        {
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.None, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.None, Segment=SegmentRegister.DS, Size = 32 },
        };

        private MemoryOperand[] regMemMemorySib =
        {
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EAX, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ECX, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDX, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBX, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.None, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EBX, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.ESI, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EBP, Index=GeneralRegister.EDI, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.ESI, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.EAX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.ECX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.EDX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.EBX, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.ESP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.EBP, Segment=SegmentRegister.SS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.ESI, Segment=SegmentRegister.DS, Size = 32 },
            new MemoryOperand { Base=GeneralRegister.EDI, Index=GeneralRegister.EDI, Segment=SegmentRegister.DS, Size = 32 },
        };

        private RegisterOperand[] registers8Bit = 
        {
            new RegisterOperand { Index=(int)GeneralRegister.EAX, Type=RegisterType.GeneralRegister, High = false, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.ECX, Type=RegisterType.GeneralRegister, High = false, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.EDX, Type=RegisterType.GeneralRegister, High = false, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.EBX, Type=RegisterType.GeneralRegister, High = false, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.EAX, Type=RegisterType.GeneralRegister, High = true, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.ECX, Type=RegisterType.GeneralRegister, High = true, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.EDX, Type=RegisterType.GeneralRegister, High = true, Size=8 },
            new RegisterOperand { Index=(int)GeneralRegister.EBX, Type=RegisterType.GeneralRegister, High = true, Size=8 },
        };

        private RegisterOperand[] registers16Bit = 
        {
            new RegisterOperand { Index=(int)GeneralRegister.EAX, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.ECX, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.EDX, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.EBX, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.ESP, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.EBP, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.ESI, Type=RegisterType.GeneralRegister, Size=16 },
            new RegisterOperand { Index=(int)GeneralRegister.EDI, Type=RegisterType.GeneralRegister, Size=16 },
        };

        private RegisterOperand[] registers32Bit = 
        {
            new RegisterOperand { Index=(int)GeneralRegister.EAX, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.ECX, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.EDX, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.EBX, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.ESP, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.EBP, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.ESI, Type=RegisterType.GeneralRegister, Size=32 },
            new RegisterOperand { Index=(int)GeneralRegister.EDI, Type=RegisterType.GeneralRegister, Size=32 },
        };

        private RegisterOperand[] registersSegment =
        {
            new RegisterOperand { Index=(int)SegmentRegister.ES, Type=RegisterType.SegmentRegister },
            new RegisterOperand { Index=(int)SegmentRegister.CS, Type=RegisterType.SegmentRegister },
            new RegisterOperand { Index=(int)SegmentRegister.SS, Type=RegisterType.SegmentRegister },
            new RegisterOperand { Index=(int)SegmentRegister.DS, Type=RegisterType.SegmentRegister },
            new RegisterOperand { Index=(int)SegmentRegister.FS, Type=RegisterType.SegmentRegister },
            new RegisterOperand { Index=(int)SegmentRegister.GS, Type=RegisterType.SegmentRegister },
        };

        private RegisterOperand[] registersControl =
        {
            new RegisterOperand { Index=(int)ControlRegister.CR0, Type=RegisterType.ControlRegister },
            new RegisterOperand { Index=(int)ControlRegister.CR1, Type=RegisterType.ControlRegister },
            new RegisterOperand { Index=(int)ControlRegister.CR2, Type=RegisterType.ControlRegister },
            new RegisterOperand { Index=(int)ControlRegister.CR3, Type=RegisterType.ControlRegister },
            new RegisterOperand { Index=(int)ControlRegister.CR4, Type=RegisterType.ControlRegister },
        };

        internal static string[] registerStrings8BitLow =
        {
            "AL",
            "CL",
            "DL",
            "BL",
            "AH",
            "CH",
            "DH",
            "BH"
        };

        internal static string[] registerStrings8BitHigh =
        {
            "AH",
            "CH",
            "DH",
            "BH"
        };

        internal static string[] registerStrings16Bit =
        {
            "AX",
            "CX",
            "DX",
            "BX",
            "SP",
            "BP",
            "SI",
            "DI",
        };

        internal static string[] registerStrings32Bit =
        {
            "EAX",
            "ECX",
            "EDX",
            "EBX",
            "ESP",
            "EBP",
            "ESI",
            "EDI",
        };

        internal static string[] registerStringsSegment =
        {
            "ES",
            "CS",
            "SS",
            "DS",
            "FS",
            "GS"
        };

        internal static string[] registerStringsControl = 
        {
            "CR0",
            "CR1",
            "CR2",
            "CR3",
            "CR4"
        };
    }
}
